Normally, when calling a function, the value of this inside the function is the object that the function is being accessed on.
With call(), apply() and bind() we can assign an arbitrary value as this when calling an existing function without attaching the function to the object as a property.  They allow you to explicitly specify the value of `this` when invoking a function, which can be particularly useful when dealing with functions that have dynamic or uncertain contexts.
With them an object can use a method belonging to another object as generic utility functions enabling function borrowing
- call() method takes arguments separately.
 - apply() takes an array while 
 - bind() also takes arguments separately. returns a bound function that, when executed later, will have the correct context ("this") for calling the original function. So bind() can be used when the function needs to be called later in certain events when it's useful.